﻿
namespace AdventureWorksApp.Web
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Data;
    using System.Linq;
    using System.ServiceModel.DomainServices.EntityFramework;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;


    // Реализует логику приложения с использованием контекста AdventureWorks2008Entities.
    // TODO: добавьте свою прикладную логику в эти или другие методы.
    // TODO: включите проверку подлинности (Windows/ASP.NET Forms) и раскомментируйте следующие строки, чтобы запретить анонимный доступ
    // Кроме того, рассмотрите возможность добавления ролей для соответствующего ограничения доступа.
    // [RequiresAuthentication]
    [EnableClientAccess()]
    public class OrganizationService : LinqToEntitiesDomainService<AdventureWorks2008Entities>
    {

        // TODO:
        // рассмотрите возможность сокращения результатов метода запроса.  Если необходим дополнительный ввод,
        // то в этот метод можно добавить параметры или создать дополнительные методы выполнения запроса с другими именами.
        // Для поддержки разбиения на страницы добавьте упорядочение в запрос "Employee".
        public IQueryable<Employee> GetEmployee()
        {
            //return this.ObjectContext.Employee;
            return this.ObjectContext.Employee.OrderBy(e => e.BusinessEntityID);
        }
        public IQueryable<Employee> GetSalariedEmployees()
        {
            return this.ObjectContext.Employee.Where(e => e.SalariedFlag == true).OrderBy(e => e.BusinessEntityID);
        }

        public void InsertEmployee(Employee employee)
        {
            employee.HireDate = DateTime.Now;
            employee.ModifiedDate = DateTime.Now;
            employee.VacationHours = 0;
            employee.SickLeaveHours = 0;
            employee.rowguid = Guid.NewGuid();
            employee.BusinessEntityID = 1001;
            employee.BirthDate = new DateTime(1967, 3, 18);

            if ((employee.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(employee, EntityState.Added);
            }
            else
            {
                this.ObjectContext.Employee.AddObject(employee);
            }
        }

        public void UpdateEmployee(Employee currentEmployee)
        {
            this.ObjectContext.Employee.AttachAsModified(currentEmployee, this.ChangeSet.GetOriginal(currentEmployee));
        }

        public void DeleteEmployee(Employee employee)
        {
            if ((employee.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(employee, EntityState.Deleted);
            }
            else
            {
                this.ObjectContext.Employee.Attach(employee);
                this.ObjectContext.Employee.DeleteObject(employee);
            }
        }

        [RequiresAuthentication]
        public void ApproveSabbatical(Employee current)
        {
            // Start custom workflow here
            this.ObjectContext.Employee.AttachAsModified(current);
            current.CurrentFlag = false;
        }

        [RequiresAuthentication]
        public void ApproveSabbaticalPar(Employee current, bool parCurrentFlag)
        {
            // Start custom workflow here
            this.ObjectContext.Employee.AttachAsModified(current);
            current.CurrentFlag = parCurrentFlag;
        }

        // TODO:
        // рассмотрите возможность сокращения результатов метода запроса.  Если необходим дополнительный ввод,
        // то в этот метод можно добавить параметры или создать дополнительные методы выполнения запроса с другими именами.
        // Для поддержки разбиения на страницы добавьте упорядочение в запрос "PurchaseOrderDetail".
        public IQueryable<PurchaseOrderDetail> GetPurchaseOrderDetail()
        {
            return this.ObjectContext.PurchaseOrderDetail;
        }

        public void InsertPurchaseOrderDetail(PurchaseOrderDetail purchaseOrderDetail)
        {
            if ((purchaseOrderDetail.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(purchaseOrderDetail, EntityState.Added);
            }
            else
            {
                this.ObjectContext.PurchaseOrderDetail.AddObject(purchaseOrderDetail);
            }
        }

        public void UpdatePurchaseOrderDetail(PurchaseOrderDetail currentPurchaseOrderDetail)
        {
            this.ObjectContext.PurchaseOrderDetail.AttachAsModified(currentPurchaseOrderDetail, this.ChangeSet.GetOriginal(currentPurchaseOrderDetail));
        }

        public void DeletePurchaseOrderDetail(PurchaseOrderDetail purchaseOrderDetail)
        {
            if ((purchaseOrderDetail.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(purchaseOrderDetail, EntityState.Deleted);
            }
            else
            {
                this.ObjectContext.PurchaseOrderDetail.Attach(purchaseOrderDetail);
                this.ObjectContext.PurchaseOrderDetail.DeleteObject(purchaseOrderDetail);
            }
        }

        // TODO:
        // рассмотрите возможность сокращения результатов метода запроса.  Если необходим дополнительный ввод,
        // то в этот метод можно добавить параметры или создать дополнительные методы выполнения запроса с другими именами.
        // Для поддержки разбиения на страницы добавьте упорядочение в запрос "PurchaseOrderHeader".
        public IQueryable<PurchaseOrderHeader> GetPurchaseOrderHeader()
        {
            //return this.ObjectContext.PurchaseOrderHeader;
            return this.ObjectContext.PurchaseOrderHeader.Include("PurchaseOrderDetail").OrderBy(p => p.PurchaseOrderID);
        }

        public void InsertPurchaseOrderHeader(PurchaseOrderHeader purchaseOrderHeader)
        {
            if ((purchaseOrderHeader.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(purchaseOrderHeader, EntityState.Added);
            }
            else
            {
                this.ObjectContext.PurchaseOrderHeader.AddObject(purchaseOrderHeader);
            }
        }

        public void UpdatePurchaseOrderHeader(PurchaseOrderHeader currentPurchaseOrderHeader)
        {
            this.ObjectContext.PurchaseOrderHeader.AttachAsModified(currentPurchaseOrderHeader, this.ChangeSet.GetOriginal(currentPurchaseOrderHeader));
        }

        public void DeletePurchaseOrderHeader(PurchaseOrderHeader purchaseOrderHeader)
        {
            if ((purchaseOrderHeader.EntityState != EntityState.Detached))
            {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(purchaseOrderHeader, EntityState.Deleted);
            }
            else
            {
                this.ObjectContext.PurchaseOrderHeader.Attach(purchaseOrderHeader);
                this.ObjectContext.PurchaseOrderHeader.DeleteObject(purchaseOrderHeader);
            }
        }
    }
}


